package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import play.db.DB;
import models.Produto;
import models.Unidade;

public class DAOProduto implements DAO<Produto> {

	@Override
	public Integer inserir(Produto p) {
		try {
			Connection conexao = DB.getConnection();
			String sql_stm = "INSERT INTO produtos (nome, unidade) VALUES(?, ?)";
			PreparedStatement prep = conexao.prepareStatement(sql_stm, Statement.RETURN_GENERATED_KEYS);
			prep.setString(1, p.nome);
			prep.setInt(2, p.unidade.id);
			prep.executeUpdate();
			ResultSet rs = prep.getGeneratedKeys();
			rs.next();
			int id = rs.getInt(1);
			rs.close();
			return id;
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}

	}

	@Override
	public void atualizar(Produto p) {
		try {
			Connection conexao = DB.getConnection();
			PreparedStatement prep = conexao
					.prepareStatement("UPDADE produtos SET nome=?, id_unidades=? WHERE id=?");
			prep.setString(1, p.nome);
			prep.setInt(2, p.unidade.id);
			prep.setInt(3, p.id);
			prep.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}

	}

	@Override
	public void excluir(Integer id) {
		try {
			Connection conexao = DB.getConnection();
			PreparedStatement prep = conexao.prepareStatement("DELETE FROM produtos WHERE id=?");
			prep.setInt(1, id);
			prep.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}

	}

	@Override
	public List<Produto> todos() {
		List<Produto> produtos = new ArrayList<Produto>();
		try {
			Connection conexao = DB.getConnection();
			String sql_stm = "SELECT p.id,p.nome,p.id_unidades,u.nome,u.abreviatura " +
							"FROM produtos p INNER JOIN unidades u ON p.id_unidades=u.id";
			PreparedStatement prep = conexao.prepareStatement(sql_stm);
			ResultSet rs = prep.executeQuery();
			while(rs.next()) {
				produtos.add(geraProduto(rs));
			}
			rs.close();
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
		return produtos;
	}

	@Override
	public Produto getById(Integer id) {
		try {
			Connection conexao = DB.getConnection();
			String sql_stm = "SELECT p.id,p.nome,p.id_unidades,u.nome,u.abreviatura " +
							"FROM produtos p INNER JOIN unidades u ON p.id_unidades=u.id " +
							"WHERE p.id=?";
			PreparedStatement prep = conexao.prepareStatement(sql_stm);
			prep.setInt(1, id);
			ResultSet rs = prep.executeQuery();
			if(rs.next()) {
				return geraProduto(rs);
			} else {
				return null;
			}
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
	
	private Produto geraProduto(ResultSet rs) {
		try {
			Produto p = new Produto();
			p.id = rs.getInt(1);
			p.nome = rs.getString(2);
			p.unidade = new Unidade();
			p.unidade.id = rs.getInt(3);
			p.unidade.nome = rs.getString(4);
			p.unidade.abreviatura = rs.getString(5);
			
			return p;
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
}
